#include "Container.h"

container::container()
{

}

void container::AddVideo(video param)
{ //video aan de lijst toevoegen
	Videolist.push_back(param);
}

void container::EnableStreams(bool VideoEnabled, bool AudioEnabled)
{
	Encoder.EnableStreams(VideoEnabled, AudioEnabled);
}
void container::SetEncoder(char *filename, int bitrate, int den, int num, int gopsize, int width, int height, int sample_rate, int audio_bitrate, int channels, CodecID videoCodec, CodecID audioCodec)
{ //de Encoder opzetten... Hier zal nog Audio opzet info bij moeten komen
	Encoder.SetupEncoder(filename, videoCodec, audioCodec); //fileke bijhouden
	if(Videolist.size() > 0)
		Encoder.FillParameters(bitrate, den, num, gopsize, width, height, sample_rate, audio_bitrate, channels); //parameteres van de Encoder aanvullen
	Encoder.OpenOutput(); //fileke openen
}

void container::Process()
{ //The magic Starts Here!
	for(int i = 0; i < Videolist.size(); i++)
	{	//ga de lijst af
		Encoder.SetConvertParameters(Videolist[i].GetVideoCodecContext()); //dit is voor te scalen naar andere resultie 
		while ( av_read_frame( Videolist[i].GetAVFormatContext(), &packet ) >= 0 ) //lees in
		{
			if (packet.stream_index == Videolist[i].GetVideoStreamIndex() && Encoder.IsVideoEnabled()) 
			{ //als da een video is Decode & dan encode
				frame = Videolist[i].DecodeVideo(packet);
				if(frame != NULL)
					Encoder.EncodeVideo(frame);
			}
			else if (packet.stream_index == Videolist[i].GetAudioStreamIndex() && Encoder.IsAudioEnabled()) 
			{ //als da audio is, moet nog gemaakt worden
				Videolist[i].DecodeAudio(packet);
				if(Videolist[i].IsSample())
						Encoder.EncodeAudio(Videolist[i].GetSample(), Videolist[i].GetBuffersize());
			}
		}
	}
	Encoder.CloseOutput(); //sluit het fileke
}